/*
 * @Author: 锦阳
 * @Create: 2021年07月19日
 */
const spawn = require('child_process').spawn;
/**
 * 运行命令行的工具集
 *
 * @memberof module:nodeUtils
 */
class CmdUtils {
    /* istanbul ignore next */
    /**
     * 在项目中执行 `npm install`
     *
     * @param {import('child_process').SpawnOptions} options spawn函数的选项参数
     * @param {boolean} prod 是否只下载生产依赖
     * @param {'npm'|'yarn'|string} [executable=npm] 依赖下载工具，可选值：'npm','yarn'或其他node包管理命令
     * @returns {Promise<void>}
     */
    static async installDependencies(options, prod, executable = 'npm') {
        return this.runCommand(
            executable,
            [
                'install',
                prod && '--production',
            ].filter(Boolean),
            options,
        );
    }

    /**
     * 生成一个子进程并运行指定的命令
     * 默认情况下，运行在CWD和'inherit'的stdio
     * 选项与node的child_process.spawn相同
     *
     * @param {string} cmd 命令
     * @param {Array<string>} args 参数数组
     * @param {import('child_process').SpawnOptions} options spawn函数的选项参数
     * @returns {Promise<void>}
     */
    static runCommand(cmd, args, options) {
        return new Promise((resolve, reject) => {
            const spwan = spawn(
                cmd,
                args,
                Object.assign(
                    {
                        cwd: process.cwd(),
                        stdio: 'inherit',
                        shell: true,
                    },
                    options,
                ),
            );
            /* istanbul ignore next */
            spwan.on('exit', code => {
                if (code === 0) {
                    resolve();
                } else {
                    reject(new Error([cmd, ...(args || [])].join(' ') + '执行失败'));
                }
            });
        });
    }
}

module.exports = CmdUtils;
